package com.sky.wsp.warning.controller;

import com.sky.wsp.warning.vo.Event;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.TreeSet;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * 事件管理器
 *
 * @author wangshaopeng@talkweb.com.cn
 * @desccription 在此输入描述
 * @date 2023/7/3
 */
@RestController
public class WarnController {
    private static final ArrayBlockingQueue<Event> Q = new ArrayBlockingQueue(100);

    /**
     * 接收推送过来的事件
     *
     * @param event
     * @return
     */
    @GetMapping("/push")
    public String push(Event event) {
        if (null == event || null == event.getAudio()) {
            return "fail";
        }
        if (null == event.getDate()) {
            event.setDate(new Date());
        }
        if (Q.remainingCapacity() == 0) {
            // 队列已满，则自动替换
            Q.poll();
        }
        Q.add(event);
        System.out.println("ok => " + event);
        return "ok";
    }

    /**
     * 事件出栈
     *
     * @return
     */
    @GetMapping("/pop")
    public Event pop() {
        return Q.isEmpty() ? new Event() : Q.poll();
    }

    /**
     * 事件批量出站
     *
     * @return
     */
    @GetMapping("/pop10")
    public TreeSet<Event> pop10() {
        // 去除重复事件
        TreeSet<Event> set = new TreeSet<>();
        while (!Q.isEmpty()) {
            Event v = Q.poll();
            set.add(v);
            if (set.size() > 9) {
                // 一次最多返回10个事件
                break;
            }
        }
        return set;
    }

    /**
     * 清空事件
     *
     * @return
     */
    @GetMapping("/clear")
    public String clear() {
        Q.clear();
        return "ok";
    }
}
